/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.sapra.abc;

import java.util.List;
import nextapp.echo2.app.Alignment;
import nextapp.echo2.app.Button;
import nextapp.echo2.app.Color;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.Extent;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.SelectField;
import nextapp.echo2.app.TextField;
import nextapp.echo2.app.Label;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.list.DefaultListModel;
import org.sapra.dao.Colonia;
import org.sapra.dao.Direccion;
import org.sapra.dao.Estado;
import org.sapra.dao.Pais;
import org.sapra.dao.Poblacion;
import org.sapra.dao.Usuario;
import org.sapra.echo.Helpers;
import org.sapra.echo.wAviso;
import org.sapra.logon.dLogin;
import org.sapra.main.vPrincipal;

/**
 *
 * @author ppratsc
 */
public class vDireccion extends nextapp.echo2.app.ContentPane {


    SelectField mSelPais;
    SelectField mSelEstado;
    SelectField mSelPoblacion;
    SelectField mSelColonia;

    TextField mPais;
    TextField mEstado;
    TextField mPoblacion;
    TextField mColonia;

    TextField mZip;
    TextField mCalle;
    TextField mNumExt;
    TextField mNumInt;
    Label cp;

    Button mbPais;
    Button mbEstado;
    Button mbPoblacion;
    Button mbColonia;
    
    Pais dPais;
    Estado dEstado;
    Poblacion dPoblacion;
    Colonia dColonia;

    boolean mPaisEdit = false;
    boolean mEstadoEdit = false;
    boolean mPoblacionEdit = false;
    boolean mColoniaEdit = false;


    Column mParent = null;
    private vPrincipal princ;
    public vDireccion(vPrincipal princ) {
        super();
        this.princ=princ;
        initComponents();
    }

    public vDireccion(Column parent){
        mParent = parent;
        initComponents();
    }
    private Row row1,row2,row3,row4,row5;

    public void hidden(boolean opc){
        row1.setVisible(opc);
        row2.setVisible(opc);
        /*row3.setVisible(opc);
        row4.setVisible(opc);*/
        if(mParent != null)
            row5.setVisible(opc);

    }

    private void initComponents() {

        Column col1;


        if(mParent != null) col1 = mParent;
        else{
            col1 = Helpers.Column("Default", new Extent(5),this);
            Row x=princ.getMenu();
            x.setAlignment(Alignment.ALIGN_CENTER);
            col1.add(x);
        }
        //col1.setInsets(new Insets(new Extent(290), new Extent(0), new Extent(290),new Extent(0)));
        // Paises
        Helpers.Label("MODIFICAR O AGREGAR DATOS DE DIRECCIONES.", new Color(0x011dac), col1);
        row1 = Helpers.Row("Default", new Extent(5), col1);
        Helpers.Label("PAIS:", Color.BLACK, row1);
        mSelPais = Helpers.SelectField(row1, new ActionListener(){public void actionPerformed(ActionEvent e) {PaisSelect(e);}});
        mSelPais.setWidth(new Extent(250));
        mbPais = Helpers.Button("+", row1, new ActionListener(){public void actionPerformed(ActionEvent e) {PaisAgregar(e);}});
        //Helpers.Button("ELIMINAR", row1, new ActionListener(){public void actionPerformed(ActionEvent e) {PaisEliminar(e);}});
        mPais = Helpers.Text("", row1);
        mPais.setVisible(false);
        
        // Estados
        row2 = Helpers.Row("Default", new Extent(5), col1);
        Helpers.Label("ESTADO:", Color.BLACK, row2);
        mSelEstado = Helpers.SelectField(row2, new ActionListener(){public void actionPerformed(ActionEvent e) {EstadoSelect(e);}});
        mSelEstado.setWidth(new Extent(250));
        mbEstado = Helpers.Button("+", row2, new ActionListener(){public void actionPerformed(ActionEvent e) {EstadoAgregar(e);}});
        //Helpers.Button("ELIMINAR", row2, new ActionListener(){public void actionPerformed(ActionEvent e) {EstadoEliminar(e);}});
        mEstado = Helpers.Text("", row2);
        mEstado.setVisible(false);

        // Poblacion
        row3 = Helpers.Row("Default", new Extent(5), col1);
        Helpers.Label("POBLACION:", Color.BLACK, row3);
        mSelPoblacion = Helpers.SelectField(row3, new ActionListener(){public void actionPerformed(ActionEvent e) {PoblacionSelect(e);}});
        mSelPoblacion.setWidth(new Extent(250));
        mbPoblacion = Helpers.Button("+", row3, new ActionListener(){public void actionPerformed(ActionEvent e) {PoblacionAgregar(e);}});
        //Helpers.Button("ELIMINAR", row3, new ActionListener(){public void actionPerformed(ActionEvent e) {PoblacionEliminar(e);}});
        mPoblacion = Helpers.Text("", row3);
        mPoblacion.setVisible(false);

        // Colonia
        row4 = Helpers.Row("Default", new Extent(5), col1);
        Helpers.Label("COLONIA:", Color.BLACK, row4);
        mSelColonia = Helpers.SelectField(row4, new ActionListener(){public void actionPerformed(ActionEvent e) {ColoniaSelect(e);}});
        mSelColonia.setWidth(new Extent(250));
        mbColonia = Helpers.Button("+", row4, new ActionListener(){public void actionPerformed(ActionEvent e) {ColoniaAgregar(e);}});
        //Helpers.Button("ELIMINAR", row4, new ActionListener(){public void actionPerformed(ActionEvent e) {ColoniaEliminar(e);}});
        mColonia = Helpers.Text("", row4);
        mColonia.setVisible(false);
        cp=Helpers.Label("C.P:", Color.BLACK, row4);
        cp.setVisible(false);
        mZip=new TextField();
        mZip = Helpers.Text("", row4);
        mZip.setEnabled(true);
        //mZip.setVisible(true);



        //Direccion
        //Solo si es llamado en Modo de Direccion
        if(mParent != null){
            row5 = Helpers.Row("Default", new Extent(5), col1);
            Helpers.Label("CALLE:", Color.BLACK, row5);
            mCalle = Helpers.Text("", row5);
            mCalle.setWidth(new Extent(350));
            Helpers.Label("INTERIOR:", Color.BLACK, row5);
            mNumInt = Helpers.Text("", row5);
            mNumInt.setWidth(new Extent(100));
            mNumInt.setMaximumLength(5);
            Helpers.Label("EXTERIOR:", Color.BLACK, row5);
            mNumExt = Helpers.Text("", row5);
            mNumExt.setMaximumLength(5);
            mNumExt.setWidth(new Extent(100));
            Helpers.Label("C.P:", Color.BLACK, row5);
            mZip=new TextField();
            mZip = Helpers.Text("", row5);
            mZip.setEnabled(false);
        }



        FirstTime();
        hidden(true);
    }
    
    void FirstTime(){

        CleanFields();

        Usuario usr = dLogin.getUser();
        
        VisibleAdmin(usr.getTipoUsuario().equals("A"));
      

    }

    // CATALOGO DE PAISES
    void PaisCargar(){
        List<Pais> paises = dDireccion.getPaises();
        mSelPais.setModel(new DefaultListModel(paises.toArray()));
    }

    void PaisSelect(ActionEvent e){
        dPais = (Pais)mSelPais.getSelectedItem();
        EstadoCargar();
    }
    void PaisAgregar(ActionEvent e){

    }
    void PaisEliminar(ActionEvent e){

    }

    // CATALOGO DE ESTADOS

    void EstadoCargar(){
        List<Estado> estados = dDireccion.getEstados(dPais.getpaisId());
        mSelEstado.setModel(new DefaultListModel(estados.toArray()));
    }
    void EstadoSelect(ActionEvent e){
        dEstado = (Estado)mSelEstado.getSelectedItem();
        PoblacionCargar();

    }
    void EstadoAgregar(ActionEvent e){


    }
    void EstadoEliminar(ActionEvent e){
        
    }

    // CATALOGO DE POBLACIONES

    void PoblacionCargar(){
        List<Poblacion> poblaciones = dDireccion.getPoblaciones(dEstado.getestadoId());
        mSelPoblacion.setModel(new DefaultListModel(poblaciones.toArray()));
    }
    void PoblacionSelect(ActionEvent e){
        dPoblacion = (Poblacion) mSelPoblacion.getSelectedItem();
        ColoniaCargar();
    }

    void PoblacionAgregar(ActionEvent e){

    }

    void PoblacionEliminar(ActionEvent e){

    }

    // CATALOGO DE COLONIAS
    private List<Colonia> colonias;
    void ColoniaCargar(){
        colonias = dDireccion.getColonias(dPoblacion.getpoblacionId());
        mSelColonia.setSelectedIndex(-1);
        mSelColonia.setModel(new DefaultListModel(colonias.toArray()));
    }

    void ColoniaSelect(ActionEvent e){
        dColonia = (Colonia) mSelColonia.getSelectedItem();

        mZip.setText(dColonia.getcodigoPostal());
        System.out.println(dColonia.getcodigoPostal()+""+dColonia.getcoloniaId());
    }

    void ColoniaAgregar(ActionEvent e){
        
        if(dPoblacion == null)return; // NO se puede Agregar Si no hay poblacion
        mColonia.setVisible(!mColoniaEdit);
        cp.setVisible(true);
        mZip.setVisible(true);
        mZip.setEnabled(true);
        mbColonia.setText((mColoniaEdit)?"+":"<-");


        if(mColoniaEdit && !mColonia.getText().isEmpty()){
            // Guarda la Nueva Colonia
            int id = dDireccion.addColonia(dPoblacion.getpoblacionId(),mColonia.getText(), mZip.getText());
            if(id<0){
                add(new wAviso("Error","Operacion cancelada"));
            }else{
                add(new wAviso("Exito","Operacion realizada correctamente"));
            }
            ColoniaCargar(); // Hace un Reload de las Colonias
            //NO SE PUEDE SELECCIONAR EL REGISTRO INSERTADO (DEFICIENCIA DEL QUERYRUNNER)
            //mSelColonia.setSelectedItem(new Colonia(id)); // Selecciona la Nueva Colonia
            //dColonia = (Colonia) mSelColonia.getSelectedItem(); // Actualiza el Cache
            mColonia.setText(""); //Limpia el Campo
            mZip.setText("");
            cp.setVisible(false);
            mZip.setVisible(false);

        }

        mColoniaEdit = !mColoniaEdit;
    }

    void ColoniaEliminar(ActionEvent e){

    }

    private void VisibleAdmin(boolean admin) {
        mbPais.setVisible(admin);
        mbEstado.setVisible(admin);
        mbPoblacion.setVisible(admin);
        mbColonia.setVisible(admin);
    }

    public boolean SetDireccion(int id){
        boolean resp = false;
        //Busca la Direccion
        Direccion dir = dDireccion.getDireccion(id);

        if( dir != null){

            //Encontramos la direccion
            mSelPais.setSelectedItem(new Pais(dir.getpaisId()));
            PaisSelect(null);
            mSelEstado.setSelectedItem(new Estado(dir.getestadoId()));
            EstadoSelect(null);
            mSelPoblacion.setSelectedItem(new Poblacion(dir.getpoblacionId()));
            PoblacionSelect(null);
            mSelColonia.setSelectedItem(new Colonia(dir.getcoloniaId()));
            ColoniaSelect(null);
            mCalle.setText(dir.getcalle());
            mNumExt.setText(dir.getnumero_exterior());
            mNumInt.setText(dir.getnumero_interior());
            mZip.setText(dir.getcodigoPostal());
            resp = true;
        }

        return resp;
    }

    public int SaveDireccion(boolean add){
        int resp = -1;
        Direccion dir = getFields();
        dir.setdireccionId(-1); // TODO: Siempre es una direccion Nueva (ESTO SE DEBE DE CAMBIAR)
        //Valida la Direccion
        
        //Regresa el Resultado del Save
        return dDireccion.Save(dir);
    }

    public void SetEdit(boolean edit){
        mSelPais.setEnabled(edit);
        mSelEstado.setEnabled(edit);
        mSelPoblacion.setEnabled(edit);
        mSelColonia.setEnabled(edit);

        mPais.setEnabled(edit);
        mEstado.setEnabled(edit);
        mPoblacion.setEnabled(edit);
        mColonia.setEnabled(edit);
        
        Usuario usr = dLogin.getUser();
        
        VisibleAdmin(usr.getTipoUsuario().equals("A") && edit);

        if(mParent != null){
            mCalle.setEnabled(edit);
            mNumInt.setEnabled(edit);
            mNumExt.setEnabled(edit);
            mZip.setEnabled(false);
        }

    }

    void CleanFields() {
        PaisCargar(); // Busca los Paises
        mSelPais.setSelectedItem(new Pais(1));//Selecciona Mexico
        dPais = (Pais) mSelPais.getSelectedItem();

        EstadoCargar(); // Carga Estados
        mSelEstado.setSelectedItem(new Estado(19));//Selecciona Nuevo Leon
        dEstado = (Estado) mSelEstado.getSelectedItem();

        PoblacionCargar(); // Carga Poblaciones de Nuevo Leon
        mSelPoblacion.setSelectedIndex(-1);
        //mSelColonia=new SelectField();
        mSelColonia.setSelectedIndex(-1);
        if(mParent != null) {
            mCalle.setText("");
            mNumInt.setText("");
            mNumExt.setText("");
            mZip.setText("");
        }


    }

    private Direccion getFields() {
        Direccion resp = new Direccion();

        // Identicia la Colonia
        Colonia colonia = (Colonia) mSelColonia.getSelectedItem();
        if(colonia == null )return null;
        resp.setcoloniaId(colonia.getcoloniaId());

        resp.setcodigoPostal(mZip.getText());
        resp.setcalle(mCalle.getText());
        resp.setnumero_exterior(mNumExt.getText());
        resp.setnumero_interior(mNumInt.getText());
        
        return resp;
    }

    public List<Colonia> getColonias() {
        return colonias;
    }

    public void setColonias(List<Colonia> colonias) {
        this.colonias = colonias;
    }

    

}
